package com.nbicc.survey.service.impl;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.Page;
import com.nbicc.common.Const;
import com.nbicc.common.RequestPageObj;
import com.nbicc.common.ResponseObj;
import com.nbicc.parent.serivce.BaseService;
import com.nbicc.survey.mapper.QuestionnaireMapper;
import com.nbicc.survey.po.*;
import com.nbicc.survey.service.*;
import com.nbicc.survey.vo.QuestionnaireQueryCondition;
import com.nbicc.utils.ToolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;

@Service("QuestionnaireServiceImpl")
public class QuestionnaireServiceImpl extends BaseService implements IQuestionnaireService {

    @Autowired
    private QuestionnaireMapper questionnaireMapper;
    @Resource(name = "MultipleChoiceTopicServiceImpl")
    private IMultipleChoiceTopicService multipleChoiceTopicService;
    @Resource(name = "MultipleSelectionTopicServiceImpl")
    private IMultipleSelectionTopicService multipleSelectionTopicService;
    @Resource(name = "EssayQuestionTopicServiceImpl")
    private IEssayQuestionTopicService essayQuestionTopicService;
    @Resource(name = "QuestionnaireTopicServiceImpl")
    private IQuestionnaireTopicService questionnaireTopicService;
    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public Questionnaire selectById(String id) {
        return questionnaireMapper.selectById(id);
    }


    @Override
    public Integer insert(Questionnaire questionnaire) {
        questionnaire.setId(ToolUtil.generateUUID32());
        questionnaire.setQuestionnaireStatus(QuestionnaireStatusEnum.NotStarted);
        questionnaire.setCreateTime(new Date());
        return questionnaireMapper.insert(questionnaire);
    }

    @Override
    public Integer updateById(Questionnaire questionnaire) {
        return questionnaireMapper.updateById(questionnaire);
    }

    @Override
    public Integer deleteById(String id) {
        return questionnaireMapper.deleteById(id);
    }

    @Transactional
    @Override
    public void insertEntire(QuestionnaireTopicEntire questionnaireTopicEntire) {
        this.insert(questionnaireTopicEntire.getQuestionnaire());
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getMultipleChoiceTopicList())){
            multipleChoiceTopicService.batchInsert(questionnaireTopicEntire.getMultipleChoiceTopicList());
        }
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getMultipleSelectionTopicList())){
            multipleSelectionTopicService.batchInsert(questionnaireTopicEntire.getMultipleSelectionTopicList());
        }
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getEssayQuestionTopicList())){
            essayQuestionTopicService.batchInsert(questionnaireTopicEntire.getEssayQuestionTopicList());
        }
        List<Topic> topicList = getTopicListByQuestionnaireTopicEntire(questionnaireTopicEntire);

        List<QuestionnaireTopic> questionnaireTopicList = new ArrayList<>();
        for (Topic topic : topicList) {
            QuestionnaireTopic questionnaireTopic = new QuestionnaireTopic();
            questionnaireTopic.setQuestionnaireId(questionnaireTopicEntire.getQuestionnaire().getId());
            questionnaireTopic.setTopicId(topic.getId());
            questionnaireTopicList.add(questionnaireTopic);
        }
        questionnaireTopicService.insertAll(questionnaireTopicList);
    }

    @Override
    public ResponseObj find(RequestPageObj<Map<String, Object>> requestPageObj) {
        setPageHelper(requestPageObj , Questionnaire.TABLE_SURVEY_QUESTIONNAIRE);
        List<Questionnaire> questionnaireList = questionnaireMapper.selectByMap(requestPageObj.getData());
        return new ResponseObj(Const.HTTP_STATUS_SUCCESS, questionnaireList, ((Page<?>) questionnaireList).getTotal());
    }

    public List<Questionnaire> selectList(QuestionnaireQueryCondition questionnaireQueryCondition) throws Exception {
//        Map<String , Object> condition = new HashMap<>();
//        condition.put("questionnaireStatus",questionnaireQueryCondition.getQuestionnaireStatus());
        List<Questionnaire> questionnaireList = questionnaireMapper.selectByMap(objectMapper.readValue(objectMapper.writeValueAsString(questionnaireQueryCondition),Map.class));
        return questionnaireList;
    }

    /**
     * 启动
     * @param id
     */
    @Override
    public void start(String id) {
        Questionnaire questionnaire = this.selectById(id);
        if(questionnaire.getQuestionnaireStatus() == QuestionnaireStatusEnum.NotStarted){
            questionnaire.setQuestionnaireStatus(QuestionnaireStatusEnum.InProgress);
            questionnaire.setStartTime(new Date());
            this.updateById(questionnaire);
        }
    }

    @Override
    public void finish(String id) {
        Questionnaire questionnaire = this.selectById(id);
        if(questionnaire.getQuestionnaireStatus() == QuestionnaireStatusEnum.InProgress){
            questionnaire.setQuestionnaireStatus(QuestionnaireStatusEnum.Finish);
            questionnaire.setFinishTime(new Date());
            this.updateById(questionnaire);
        }
    }

    @Override
    public QuestionnaireTopicEntire selectByIdEntire(String id) {
        QuestionnaireTopicEntire questionnaireTopicEntire = new QuestionnaireTopicEntire();
        questionnaireTopicEntire.setQuestionnaire(this.selectById(id));
        questionnaireTopicEntire.setMultipleChoiceTopicList(multipleChoiceTopicService.selectListByQuestionnaireId(id));
        questionnaireTopicEntire.setMultipleSelectionTopicList(multipleSelectionTopicService.selectListByQuestionnaireId(id));
        questionnaireTopicEntire.setEssayQuestionTopicList(essayQuestionTopicService.selectListByQuestionnaireId(id));
        return questionnaireTopicEntire;
    }

    /**
     * 是否允许回答
     * @param id
     * @return
     */
    @Override
    public boolean allowToAnswer(String id) {
        Questionnaire questionnaire = this.selectById(id);
        //只有InProgress状态 才允许
        if(questionnaire != null && questionnaire.getQuestionnaireStatus() == QuestionnaireStatusEnum.InProgress){
            return true;
        }
        return false;
    }

    private List<Topic> getTopicListByQuestionnaireTopicEntire(QuestionnaireTopicEntire questionnaireTopicEntire){
        List<Topic> topicList = new ArrayList<>();
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getMultipleChoiceTopicList())){
            for (MultipleChoiceTopic multipleChoiceTopic : questionnaireTopicEntire.getMultipleChoiceTopicList()) {
                topicList.add(multipleChoiceTopic);
            }
        }
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getMultipleSelectionTopicList())){
            for (MultipleSelectionTopic multipleSelectionTopic : questionnaireTopicEntire.getMultipleSelectionTopicList()) {
                topicList.add(multipleSelectionTopic);
            }
        }
        if(!CollectionUtils.isEmpty(questionnaireTopicEntire.getEssayQuestionTopicList())){
            for (EssayQuestionTopic essayQuestionTopic : questionnaireTopicEntire.getEssayQuestionTopicList()) {
                topicList.add(essayQuestionTopic);
            }

        }
        return topicList;
    }

}
